/*********************************************
 * @autheur : CHOLLET Clément                *
 * @date    : 03.04.2013                     *
 * @version : 1.0 - Création de la classe    *
 *********************************************/

#include "materiaux.h"

//-----------------------------------------------------Constructeurs et destructeurs-----------------------------------------------------//

/****************************************************************************
 * Constructeur avec paramètres                                             *
 * On initialise les couleurs ambiante,diffuse,speculaire  avec les valeurs *
 * par défaut spécifier par OpenGL                                          *
 ****************************************************************************/
Materiaux::Materiaux()
{
    _couleurAmbiante[0] = 0.2f;
    _couleurAmbiante[1] = 0.2f;
    _couleurAmbiante[2] = 0.2f;
    _couleurAmbiante[3] = 1.0f;

    _couleurDiffuse[0] = 0.8f;
    _couleurDiffuse[1] = 0.8f;
    _couleurDiffuse[2] = 0.8f;
    _couleurDiffuse[3] = 1.0f;

    _couleurSpeculaire[0] = 0.0f;
    _couleurSpeculaire[1] = 0.0f;
    _couleurSpeculaire[2] = 0.0f;
    _couleurSpeculaire[3] = 1.0f;

    _couleurEmission[0] = 0.0f;
    _couleurEmission[1] = 0.0f;
    _couleurEmission[2] = 0.0f;
    _couleurEmission[3] = 1.0f;

    _brillanceSpeculaire[0] = 0.0f;
}

/****************************************************************************
 * Constructeur par recopie
 ****************************************************************************/
Materiaux::Materiaux(const Materiaux& materiaux)
{
    _couleurAmbiante[0] = materiaux._couleurAmbiante[0];
    _couleurAmbiante[1] = materiaux._couleurAmbiante[1];
    _couleurAmbiante[2] = materiaux._couleurAmbiante[2];
    _couleurAmbiante[3] = materiaux._couleurAmbiante[3];

    _couleurDiffuse[0] = materiaux._couleurDiffuse[0];
    _couleurDiffuse[1] = materiaux._couleurDiffuse[1];
    _couleurDiffuse[2] = materiaux._couleurDiffuse[2];
    _couleurDiffuse[3] = materiaux._couleurDiffuse[3];

    _couleurSpeculaire[0] = materiaux._couleurSpeculaire[0];
    _couleurSpeculaire[1] = materiaux._couleurSpeculaire[1];
    _couleurSpeculaire[2] = materiaux._couleurSpeculaire[2];
    _couleurSpeculaire[3] = materiaux._couleurSpeculaire[3];

    _couleurEmission[0] = materiaux._couleurEmission[0];
    _couleurEmission[1] = materiaux._couleurEmission[1];
    _couleurEmission[2] = materiaux._couleurEmission[2];
    _couleurEmission[3] = materiaux._couleurEmission[3];

    _brillanceSpeculaire[0] = materiaux._brillanceSpeculaire[0];
}

/****************************************************************************
 * Destructeur
 ****************************************************************************/
Materiaux::~Materiaux()
{
}

//---------------------------------------------------------------Méthodes----------------------------------------------------------------//
/************************************************************************************************
 * On initialise les propriétés qui caractérisent le matériau associé à un objet de la scène 3D *
 ************************************************************************************************/
void Materiaux::initialisation()
{
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, _couleurAmbiante);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, _couleurDiffuse);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, _couleurSpeculaire);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, _couleurEmission);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, _brillanceSpeculaire);
}

//---------------------------------------------------------------Accesseurs--------------------------------------------------------------//

/****************************************************************************************
 * On affecte les valeurs RGBA à la variable _couleurAmbiante                           *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurAmbiante *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurAmbiante  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurAmbiante  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurAmbiante     *
 ****************************************************************************************/
void Materiaux::setCouleurAmbiante(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha)
{
    _couleurAmbiante[0] = rouge;
    _couleurAmbiante[1] = verte;
    _couleurAmbiante[2] = bleue;
    _couleurAmbiante[3] = alpha;

}

/***************************************************************************************
 * On affecte les valeurs RGBA à la variable _couleurDiffuse                           *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurDiffuse *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurDiffuse  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurDiffuse  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurDiffuse     *
 ***************************************************************************************/
void Materiaux::setCouleurDiffuse(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha)
{
    _couleurDiffuse[0] = rouge;
    _couleurDiffuse[1] = verte;
    _couleurDiffuse[2] = bleue;
    _couleurDiffuse[3] = alpha;
}

/******************************************************************************************
 * On affecte les valeurs RGBA à la variable _couleurSpeculaire                           *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurSpeculaire *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurSpeculaire  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurSpeculaire  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurSpeculaire     *
 ******************************************************************************************/
void Materiaux::setCouleurSpeculaire(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha)
{
    _couleurSpeculaire[0] = rouge;
    _couleurSpeculaire[1] = verte;
    _couleurSpeculaire[2] = bleue;
    _couleurSpeculaire[3] = alpha;
}


/**********************************************************************
 * On affecte la valeur de la variable _brillanceSpeculaire           *
 * @param valeur: nouvelle valeur de la variable _brillanceSpeculaire *
 **********************************************************************/
void Materiaux::setBrillanceSpeculaire(GLfloat brillance)
{
    _brillanceSpeculaire[0] = brillance;
}

/****************************************************************************************
 * On affecte les valeurs RGBA à la variable _couleurEmission                           *
 * @param rouge: nouvelle valeur de la composante rouge de la variable _couleurEmission *
 * @param vert: nouvelle valeur de la composante verte de la variable _couleurEmission  *
 * @param bleu: nouvelle valeur de la composante bleue de la variable _couleurEmission  *
 * @param alpha: nouvelle valeur du paramètre alpha de la variable _couleurEmission     *
 ****************************************************************************************/
void Materiaux::setCouleurEmission(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha)
{
    _couleurEmission[0] = rouge;
    _couleurEmission[1] = verte;
    _couleurEmission[2] = bleue;
    _couleurEmission[3] = alpha;
}


/*****************************************************
 *  Accesseur sur la couleur ambiante
 *  @return QColor : la couleur ambiamte
 *****************************************************/
QColor& Materiaux::getCouleurAmbiante()
{
    return *(new QColor(_couleurAmbiante[0]*255, _couleurAmbiante[1]*255, _couleurAmbiante[2]*255, _couleurAmbiante[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur diffuse
 *  @return QColor : la couleur diffuse
 *****************************************************/
QColor& Materiaux::getCouleurDiffuse()
{
    return *(new QColor(_couleurDiffuse[0]*255, _couleurDiffuse[1]*255, _couleurDiffuse[2]*255, _couleurDiffuse[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur spéculaire
 *  @return QColor : la couleur spéculaire
 *****************************************************/
QColor& Materiaux::getCouleurSpeculaire()
{
    return *(new QColor(_couleurSpeculaire[0]*255, _couleurSpeculaire[1]*255, _couleurSpeculaire[2]*255, _couleurSpeculaire[3]*255));
}

/*****************************************************
 *  Accesseur sur la couleur de emission
 *  @return QColor : la couleur emission
 *****************************************************/
QColor& Materiaux::getCouleurEmission()
{
    return *(new QColor(_couleurEmission[0]*255, _couleurEmission[1]*255, _couleurEmission[2]*255, _couleurEmission[3]*255));
}

/*****************************************************
 *  Accesseur sur la brillance
 *  @return float : brillance
 *****************************************************/
float Materiaux::getBrillance()
{
    return _brillanceSpeculaire[0];
}

//------------------------------------------------------Surcharge des opérateurs---------------------------------------------------------//

